// 前端JWT令牌使用示例

// 配置
const API_BASE_URL = 'http://localhost:8080'; // 根据您的后端地址调整

// 存储令牌的键名
const TOKEN_KEY = 'auth_token';

// 用户登录
async function login(username, password) {
    try {
        const response = await fetch(`${API_BASE_URL}/auth/login`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                username: username,
                password: password
            })
        });

        const data = await response.json();
        
        if (data.success) {
            // 保存令牌到localStorage
            localStorage.setItem(TOKEN_KEY, data.data.token);
            console.log('登录成功:', data.data.user);
            return data.data;
        } else {
            console.error('登录失败:', data.message);
            throw new Error(data.message);
        }
    } catch (error) {
        console.error('登录请求失败:', error);
        throw error;
    }
}

// 用户注册
async function register(username, password) {
    try {
        const response = await fetch(`${API_BASE_URL}/auth/register`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                username: username,
                password: password
            })
        });

        const data = await response.json();
        
        if (data.success) {
            console.log('注册成功:', data.data);
            return data.data;
        } else {
            console.error('注册失败:', data.message);
            throw new Error(data.message);
        }
    } catch (error) {
        console.error('注册请求失败:', error);
        throw error;
    }
}

// 获取存储的令牌
function getToken() {
    return localStorage.getItem(TOKEN_KEY);
}

// 检查是否已登录
function isLoggedIn() {
    return getToken() !== null;
}

// 用户登出
function logout() {
    localStorage.removeItem(TOKEN_KEY);
    console.log('已登出');
}

// 发送需要认证的请求
async function authenticatedRequest(url, options = {}) {
    const token = getToken();
    
    if (!token) {
        throw new Error('未登录，请先登录');
    }

    const headers = {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${token}`,
        ...options.headers
    };

    try {
        const response = await fetch(url, {
            ...options,
            headers
        });

        const data = await response.json();
        
        // 如果令牌过期，自动登出
        if (response.status === 401) {
            logout();
            throw new Error('令牌已过期，请重新登录');
        }

        return data;
    } catch (error) {
        console.error('认证请求失败:', error);
        throw error;
    }
}

// 获取用户信息示例
async function getUserInfo() {
    try {
        const data = await authenticatedRequest(`${API_BASE_URL}/auth/profile`);
        console.log('用户信息:', data);
        return data;
    } catch (error) {
        console.error('获取用户信息失败:', error);
        throw error;
    }
}

// 解析JWT令牌（仅用于前端显示，不验证签名）
function parseToken(token) {
    try {
        const base64Url = token.split('.')[1];
        const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
        const jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
            return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
        }).join(''));
        
        return JSON.parse(jsonPayload);
    } catch (error) {
        console.error('解析令牌失败:', error);
        return null;
    }
}

// 检查令牌是否即将过期（提前5分钟提醒）
function checkTokenExpiration() {
    const token = getToken();
    if (!token) return false;

    const payload = parseToken(token);
    if (!payload) return false;

    const now = Math.floor(Date.now() / 1000);
    const exp = payload.exp;
    const fiveMinutes = 5 * 60; // 5分钟

    if (exp - now < fiveMinutes) {
        console.warn('令牌即将过期，建议刷新');
        return true;
    }

    return false;
}

// 使用示例
async function exampleUsage() {
    try {
        // 1. 用户注册
        console.log('=== 用户注册 ===');
        await register('testuser', 'password123');
        
        // 2. 用户登录
        console.log('=== 用户登录 ===');
        const loginData = await login('testuser', 'password123');
        
        // 3. 检查登录状态
        console.log('是否已登录:', isLoggedIn());
        
        // 4. 解析令牌信息
        const tokenPayload = parseToken(loginData.token);
        console.log('令牌信息:', tokenPayload);
        
        // 5. 发送认证请求
        console.log('=== 获取用户信息 ===');
        await getUserInfo();
        
        // 6. 检查令牌过期
        checkTokenExpiration();
        
    } catch (error) {
        console.error('示例执行失败:', error);
    }
}

// 在页面加载时检查登录状态
document.addEventListener('DOMContentLoaded', function() {
    if (isLoggedIn()) {
        console.log('用户已登录');
        checkTokenExpiration();
    } else {
        console.log('用户未登录');
    }
});

// 导出函数供其他模块使用
if (typeof module !== 'undefined' && module.exports) {
    module.exports = {
        login,
        register,
        logout,
        getToken,
        isLoggedIn,
        authenticatedRequest,
        getUserInfo,
        parseToken,
        checkTokenExpiration
    };
} 